#include <boost/dll.hpp>
#include <lua.hpp>
#include <iostream>
#include <memory>
#include <map>
std::map<std::string, std::shared_ptr<boost::dll::shared_library>> hash;
int main()
{
    lua_State *L = luaL_newstate(); //这一点与原文方法不一样，5.3.5版本中使用luaL_newstate初始化L，而原文使用lua_open
    //                      // luaL_openlibs(L);
    luaopen_base(L);
    // // code1 lua_register注册函数把Lua函数和C++函数进行绑定。其实就是先用lua_pushcfunction把在c++中定义的函数压如栈中，然后lua_setglobal来设置栈顶的元素对应的值，这样就可以把lua函数和栈顶的c++函数建立引用关系。
    // // lua_register(L, "average", Average);
    // // code2  加载并执行lua脚本，此时lua中的函数average被执行，同时向栈中压如5个参数。参考栈的运行图Log index 1
    // int err = luaL_dofile(L, "../test.lua");
    // if (err)
    // {
    //     std::cerr << lua_tostring(L, -1) << std::endl;
    //     return -1;
    // }
    typedef int (*F)(lua_State * L);
    {
        F f;
        std::shared_ptr<boost::dll::shared_library> alib(new boost::dll::shared_library);
        hash["1"] = alib;

        alib->load("/home/yhaida/wsl-code/learn-rpc/rpcServer/library/libfibFunc.so");
        f = alib->get_alias<int(lua_State * L)>("fibFunc");
        lua_register(L, "average", f);
    }

    {
        F f;
        std::shared_ptr<boost::dll::shared_library> alib(new boost::dll::shared_library);
        hash["2"] = alib;

        alib->load("/home/yhaida/wsl-code/learn-rpc/rpcServer/lib/libpriFunc.so");
        f = alib->get_alias<int(lua_State * L)>("priFunc");
        lua_register(L, "average2", f);
    }
    int err = luaL_dofile(L, "../test.lua");
    if (err)
    {
        std::cerr << lua_tostring(L, -1) << std::endl;
        return -1;
    }
}